/// `Result` 是一个密封类（sealed class），用于表示一个操作可能成功或失败的结果。
///
/// 这种模式也称为 `Either` 或 `Try`，是函数式编程中处理错误的常见方式。
/// 它比传统的抛出异常（exceptions）更具表现力，因为它将成功和失败两种可能性
/// 都编码到了类型系统中，迫使调用者处理这两种情况。
///
/// - **类型安全**: 泛型 `T` 表示成功时返回的数据类型。
/// - **密封类**: `sealed` 关键字确保 `Result` 只能在同一个文件中被继承，
///   这意味着我们知道所有可能的子类（`Success` 和 `Failure`），
///   这使得在 `when` 表达式中进行详尽的模式匹配成为可能。
sealed class Result<T> {
  const Result();

  /// 创建一个表示成功的 `Result` 实例。
  factory Result.success(T data) => Success(data);

  /// 创建一个表示失败的 `Result` 实例。
  factory Result.failure(Object error) => Failure(error);

  /// 检查结果是否为成功。
  bool get isSuccess => this is Success<T>;

  /// 检查结果是否为失败。
  bool get isFailure => this is Failure<T>;

  /// 如果结果是 `Success`，则返回数据，否则返回 `null`。
  T? get data => isSuccess ? (this as Success<T>).data : null;

  /// 如果结果是 `Failure`，则返回错误对象，否则返回 `null`。
  Object? get error => isFailure ? (this as Failure<T>).error : null;
}

/// 表示成功结果的类。
class Success<T> extends Result<T> {
  /// 成功时包含的数据。
  final T data;

  const Success(this.data);
}

/// 表示失败结果的类。
class Failure<T> extends Result<T> {
  /// 失败时包含的错误对象。
  final Object error;

  const Failure(this.error);
}